<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>继承2</title>
	</head>
	<body>
		
		其他继承方式
		
		
	</body>
	<script>
		//4原型式继承：借助原型并基于已有的对象创建新对象，同时还不必因此创建自定义类型
		
		//临时中转函数
		function Obj(o){//o表示将要传递进入的一个对象
		function F(){} //F构造是一个临时新建的对象，用来存储传递过来的对象
		F.prototype = o;//将o对象实例赋值给F构造的原型对象
		return new F();//最后返回这个，得到传递过来对象的对象实例
		}
		//F.prototype = o;//其实就是相当于Desk.prototype = new Box()
		
		
		//这是字面量的声明方式，相当于var box = new Box();
		var box ={
			name :'lee',
			age:100,
			family:['哥哥','弟弟']
		};
		//box1 就等于new F()
		var  box1 = Obj(box);
		alert(box1.name);//lee
		alert(box1.family);//哥哥,弟弟
		
		//给引用对象添加内容
		box1.family.push('姐姐');
		alert(box1.family);//哥哥,弟弟,姐姐
		
		//缺点：引用类型的属性共享了
		var box2 = Obj(box) ;
		alert(box2.family);//哥哥,弟弟,姐姐
		
		
		//5 寄生式继承把  原型式+工厂模式结合起来
		//目的是为了封装创建对象的过程
		//解决了 超类型 会被调用两次的问题
		
		//临时中转函数
		function objects(o){
			function F(){}
			F.prototype =o;//原型继承
			return new F();
		}
		
		//寄生函数
		function create(o){
			var f = objects(o);
			//扩展
			f.run =function(){
				return this.name+','+this.age+','+this.family;
			}
			return f;
		}
		
		var home ={
			name :'Tom',
			age:60,
			family:['哥哥','姐姐','妹妹']
		};
		
		var  someone = create(home);
		alert(someone.run());//Tom,60,哥哥,姐姐,妹妹
		
		
		
		
		
		//6寄生组合继承(最理想的继承)
		
			//临时中转函数
		function obj_6(o){
			function F(){}
			F.prototype =o;//原型继承
			return new F();
		}
		
		//寄生函数
		function create_6(box,desk){
			var f = obj_6(box.prototype);
			f.constructor = Desk_6;//调整原型构造指针
			desk.prototype =f;
		}
		
		function Box_6(name,age){
			this.name =name;
			this.age = age;
			
		}
		Box_6.prototype.run = function(){
			return this.name +this.age +';Box_6运行中...';
		}
		
		function Desk_6(name,age){
			Box_6.call(this,name,age);//对象冒充
			
		}
		
		/* ps:　　js代码执行分为两个部分：

　　1、代码的检查装载阶段（预编译阶段），此阶段进行变量和函数的声明，但是不对变量进行赋值，变量的默认值为undefined。

　　2、代码的执行阶段，此阶段对变量进行赋值和函数的声明。*/
		
		//通过寄生组合继承来实现继承
		create_6(Box_6,Desk_6);//用来替代Desk.prototype = new Box();
		
		
		//实例对象
		var s = new Desk_6('寄生组合',100);
		alert(s.run());//寄生组合100;Box_6运行中...
		alert(s.constructor);
	</script>
</html>
